package br.unicamp.ic.sgct.server.dominio.entidades;

import br.unicamp.ic.sgct.client.dominio.to.PerfilTO;
import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.TableGenerator;

import br.unicamp.ic.sgct.client.dominio.to.PessoaTO;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;

//import it.biobytes.ammentos.AutomaticType;
//import it.biobytes.ammentos.PersistentEntity;
//import it.biobytes.ammentos.PersistentField;
@SuppressWarnings("serial")
//@PersistentEntity(sourceDomain = "T_PESSOA", primaryKey = "id_pessoa")
@Entity
@Table(name = "T_PESSOA")
@TableGenerator(name = "PESSOA_GEN", allocationSize = 1, initialValue = 1, table = "T_ID",
pkColumnName = "key", valueColumnName = "valor", pkColumnValue = "ID_PESSOA")
public class Pessoa implements Serializable {
    //@PersistentField(fieldName="id_pessoa", automatic=true, automaticType=AutomaticType.FRAMEWORK)

    @Id
    @Column(name = "ID_PESSOA")
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "PESSOA_GEN")
    private Long idPessoa;
    //@PersistentField(size="15")
    @Column(length = 15)
    private String nome;
    //@PersistentField(size="15")
    @Column(length = 15)
    private String sobreNome;
    //@PersistentField(size="18")
    @Column(length = 18)
    private String foneResidencial;
    //@PersistentField(size="18")
    @Column(length = 18)
    private String celular;
    @ManyToMany(fetch = FetchType.LAZY, targetEntity = Perfil.class)
    @JoinTable(name = "T_PESSOA_PERFIL",
    joinColumns =
    @JoinColumn(name = "PESSOA_ID", referencedColumnName = "ID_PESSOA"),
    inverseJoinColumns =
    @JoinColumn(name = "PERFIL_ID", referencedColumnName = "ID_PERFIL"))
    private Set<Perfil> perfis;

    public Pessoa() {
        super();
    }

    public Pessoa(PessoaTO to) {
        super();
        this.setCelular(to.getCelular());
        this.setFoneResidencial(to.getFoneResidencial());
        this.setIdPessoa(to.getIdPessoa());
        this.setNome(to.getNome());
        this.setSobreNome(to.getSobreNome());
    }


    /**
     *
     * @param nome
     * @param sobreNome
     * @param foneResidencial
     * @param celular
     */
    public Pessoa(String nome, String sobreNome, String foneResidencial,
            String celular) {
        super();
        this.nome = nome;
        this.sobreNome = sobreNome;
        this.foneResidencial = foneResidencial;
        this.celular = celular;
    }

    //~ getters & setters
    public Long getIdPessoa() {
        return idPessoa;
    }

    public void setIdPessoa(Long id) {
        this.idPessoa = id;
    }

    public String getNomeCompleto() {
        return nome + " " + sobreNome;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSobreNome() {
        return sobreNome;
    }

    public void setSobreNome(String sobreNome) {
        this.sobreNome = sobreNome;
    }

    public String getFoneResidencial() {
        return foneResidencial;
    }

    public void setFoneResidencial(String foneResidencial) {
        this.foneResidencial = foneResidencial;
    }

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    /**
     * Constructs a <code>String</code> with all attributes
     * in name = value format.
     *
     * @return a <code>String</code> representation
     * of this object.
     */
    public String toString() {
        final String TAB = "    ";

        String retValue = "";

        retValue = "Pessoa ( "
                + super.toString() + TAB
                + "idPessoa = " + this.idPessoa + TAB
                + "nome = " + this.nome + TAB
                + "sobreNome = " + this.sobreNome + TAB
                + "foneResidencial = " + this.foneResidencial + TAB
                + "celular = " + this.celular + TAB
                + " )";

        return retValue;
    }

    public PessoaTO getTo() {
        PessoaTO to = new PessoaTO();
        to.setCelular(celular);
        to.setFoneResidencial(foneResidencial);
        to.setIdPessoa(idPessoa);
        to.setNome(nome);
        to.setSobreNome(sobreNome);
        getListPerfilTO(to);
        return to;
    }

    private void getListPerfilTO(PessoaTO to) {
        to.setPerfis(new ArrayList<PerfilTO>());
        if (perfis != null) {
            for (Perfil perfil : perfis) {
                to.getPerfis().add(perfil.getTo());
            }
        }
    }

    /**
     * @return the perfis
     */
    public Set<Perfil> getPerfis() {
        return perfis;
    }

    /**
     * @param perfis the perfis to set
     */
    public void setPerfis(Set<Perfil> perfis) {
        this.perfis = perfis;
    }
}
